package singleton.enum_;

/**
 * @author luobo
 * @Wrong 之前错误的认为枚举类型单例是为了保证本枚举类之外的另外一个类是全局唯一的。但是此种认识并不符合单例的定义
 * ——保证一个类仅有一个实例，并提供一个访问它的全局访问点；所以枚举类型单例其实是保证本类型仅有一个示例。事实上枚举类
 * 型可以和类一样可以任意的定义自己的任意方法和属性，所以不需要另外定义一个类。
 * <p>
 * <p>
 * 使用枚举实现单例模式
 * @Question 如何保证唯一实例？编译器编译类枚举类型之后，会自动编译为一个类。枚举值如下INSTANCE将会被编译为public
 * static final SingletonMode INSTANCE;编译为SingletonMode类型，而enum编译成的类的构造函数为私有，决定了外界
 * 无法是无法构造此对象的，只能通过枚举自身实例化INSTANCE对象，而枚举类型编译之后还会添加一个静态块，且静态块中对调用
 * 构造函数对INSTANCE进行实例化。这就保证了一个枚举类型中的枚举值只会有一个实例，因为对象的实例化仅仅会在类加载的阶段进
 * 行，此后再也没有其他途径实例化了。
 * @Question 枚举类型如果被多次加载，此时如何保证枚举类型示例全局仅有一个实例？
 * @Question 是否懒加载？类似于其他的饿汉式单例模式，枚举类型会在类初始化的时候就实例化对象，所以不是懒加载。
 */
public enum SingletonMode {
    INSTANCE;
}
